<template>
    <view class="uni-table-scroll" :class="{'table--border':border,'border-none':!noData}">
        <view class="uni-table" :style="{'min-width':minWidth+'px'}" :class="{ 'table--stripe':stripe}">
            <slot></slot>
            <view v-if="noData" class="uni-table-loading">
                <view class="uni-table-text">{{emptyText}}</view>
            </view>
            <view v-show="loading" class="uni-table-mask">
                <div class="uni-table--loader"></div>
            </view>
        </view>
    </view>
</template>

<script>
/**
   * Table 表格
   * @description 用于展示多条结构类似的数据
   * @tutorial https://ext.dcloud.net.cn/plugin?id=
   * @property {Boolean}   border         是否带有纵向边框
   * @property {Boolean}   stripe         是否显示斑马线
   * @property {Boolean}   type         是否开启多选
   * @property {String}   emptyText       空数据时显示的文本内容
   * @property {Boolean}   loading       显示加载中
   * @event {Function}   selection-change   开启多选时，当选择项发生变化时会触发该事件
   */
export default {
  name: 'uniTable',
  options: {
    virtualHost: true
  },
  props: {
    // 是否有竖线
    border: {
      type: Boolean,
      default: false
    },
    // 是否显示斑马线
    stripe: {
      type: Boolean,
      default: false
    },
    // 多选
    type: {
      type: String,
      default: ''
    },
    // 没有更多数据
    emptyText: {
      type: String,
      default: '没有更多数据'
    },
    loading: {
      type: Boolean,
      default: false
    }
  },
  data () {
    return {
      noData: true,
      minWidth: 0
    }
  },
  watch: {
    loading (val) {

    }
  },
  created () {
    // 定义tr的实例数组
    this.trChildren = []
    this.backData = []
  },
  methods: {
    isNodata () {
      if (this.trChildren.length > 1) {
        this.noData = false
      } else {
        this.noData = true
      }
    },
    /**
       * 清除选中
       */
    clearSelection () {
      this.trChildren.forEach((item, index) => {
        item.value = false
      })
      this.$emit('selection-change', {
        detail: {
          index: [],
          value: []
        }
      })
    },
    check (child, check) {
      const childDom = this.trChildren.find((item, index) => child === item)
      const childDomIndex = this.trChildren.findIndex((item, index) => child === item)
      if (childDomIndex === 0) {
        if (childDom.value !== check) {
          this.backData = []
          this.trChildren.map((item, index) => item.value = check)
        }
        this.trChildren.forEach((item, index) => {
          if (index > 0 && item.value) {
            this.backData.push(index - 1)
          }
        })
      } else {
        if (!check) {
          this.trChildren[0].value = false
        }
        childDom.value = check
        if (check) {
          this.backData.push(childDomIndex - 1)
        } else {
          const index = this.backData.findIndex(item => item === (childDomIndex - 1))
          this.backData.splice(index, 1)
        }
        const domCheckAll = this.trChildren.find((item, index) => index > 0 && !item.value)
        if (!domCheckAll) {
          this.trChildren[0].value = true
        }
      }

      this.$emit('selection-change', {
        detail: {
          index: this.backData.sort(),
          value: []
        }
      })
    }
  }
}
</script>

<style lang="scss">
    .uni-table-scroll {
        width: 100%;
        overflow-x: auto;
    }

    .uni-table {
        position: relative;
        width: 100%;
        display: table;
        box-sizing: border-box;
        border-radius: 5px;
        box-shadow: 0px 0px 3px 1px rgba(0, 0, 0, 0.1);
        overflow-x: auto;
    background-color: #fff;
        /deep/ .uni-table-tr:nth-child(n+2) {
            &:hover {
                background-color: #f5f7fa;
            }
        }
    }

    .table--border {
        border: 1px #ddd solid;
    }

    .border-none {
        border-bottom: none;
    }

    .table--stripe {
        /deep/ .uni-table-tr:nth-child(2n+3) {
            background-color: #fafafa;
        }

    }

    /* 表格加载、无数据样式 */
    .uni-table-loading {
        position: relative;
        display: table-row;
        height: 50px;
        line-height: 50px;
    }

    .uni-table-text {
        position: absolute;
        right: 0;
        left: 0;
        text-align: center;
        font-size: 14px;
        color: #999;
    }

    .uni-table-mask {
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        margin: auto;
        background-color: rgba(255, 255, 255, 0.8);
        z-index: 99;
        display: flex;
        justify-content: center;
        align-items: center;
        transition: all 0.5s;
    }

    .uni-table--loader {
        width: 30px;
        height: 30px;
        border: 2px solid #aaa;
        // border-bottom-color: transparent;
        border-radius: 50%;
        animation: 2s uni-table--loader linear infinite;
        position: relative;
    }

    @keyframes uni-table--loader {
        0% {
            transform: rotate(360deg);
        }

        10% {
            border-left-color: transparent;
        }

        20% {
            border-bottom-color: transparent;
        }

        30% {
            border-right-color: transparent;
        }

        40% {
            border-top-color: transparent;
        }

        50% {
            transform: rotate(0deg);
        }

        60% {
            border-top-color: transparent;
        }

        70% {
            border-left-color: transparent;
        }

        80% {
            border-bottom-color: transparent;
        }

        90% {
            border-right-color: transparent;
        }

        100% {
            transform: rotate(-360deg);
        }
    }
</style>
